package pe.edu.upc.e41a.javasoft.jsf;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.faces.application.Application;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.faces.convert.DateTimeConverter;

import org.primefaces.component.inputtextarea.InputTextarea;
import org.primefaces.event.CloseEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.roo.addon.jsf.managedbean.RooJsfManagedBean;
import org.springframework.roo.addon.serializable.RooSerializable;

import pe.edu.upc.e41a.javasoft.domain.Categoria;
import pe.edu.upc.e41a.javasoft.domain.Publicacion;
import pe.edu.upc.e41a.javasoft.domain.Usuario;
import pe.edu.upc.e41a.javasoft.jsf.converter.CategoriaConverter;
import pe.edu.upc.e41a.javasoft.jsf.converter.UsuarioConverter;
import pe.edu.upc.e41a.javasoft.service.CategoriaService;
import pe.edu.upc.e41a.javasoft.service.PortadaService;
import pe.edu.upc.e41a.javasoft.service.PublicacionService;
import pe.edu.upc.e41a.javasoft.service.UsuarioService;


@Configurable
@ManagedBean(name = "portadaBean")
@SessionScoped
@RooSerializable
@RooJsfManagedBean(entity = Publicacion.class, beanName = "portadaBean")
public class PortadaBean implements Serializable {


	private static final long serialVersionUID = 1L;

	@Autowired
    PublicacionService publicacionService;

	@Autowired
    CategoriaService categoriaService;

	@Autowired
    UsuarioService usuarioService;
	
	@Autowired
	PortadaService portadaService;

	private String nameMasVendidas = "Publicaciones más vendidas";
	private String nameMasVisitadas = "Publicaciones más visitadas";
	private String nameUltimas = "Últimas publicaciones";

	private Publicacion publicacion;

	private boolean dataVisible = false;
	private boolean masVendidadataVisible = true;

	private List<String> columns;
	private List<String> columnsMin;

	private HtmlPanelGrid viewPanelGrid;

	private boolean createDialogVisible = false;
	
	private List<Publicacion> publicacionMasVendida;
	private List<Publicacion> publicacionMasVisitada;
	private List<Publicacion> publicacionUltimas;

	@PostConstruct
    public void init() {
        columns = new ArrayList<String>();
        columns.add("titulo");
        columns.add("descripcion");
        columns.add("tipo");
        columns.add("cantidad");
        columns.add("precio");
        
        columnsMin = new ArrayList<String>();
        columnsMin.add("titulo");
        columnsMin.add("precio");        
        publicacionMasVendida = portadaService.listarPublicacionMasVendidas();
        publicacionMasVisitada = portadaService.listarPublicacionMasVisitadas();
        publicacionUltimas = portadaService.listarPublicacionUltimas();
    }
	
	public String getNameMasVendidas() {
		return nameMasVendidas;
	}

	public String getNameMasVisitadas() {
		return nameMasVisitadas;
	}
	
	public String getNameUltimas() {
		return nameUltimas;
	}	
	
	public List<String> getColumns() {
        return columns;
    }	
	
	public List<String> getColumnsMin() {
        return columnsMin;
    }	
	
	public List<Publicacion> getPublicacionMasVendida() {
        return publicacionMasVendida;
    }
	
	public List<Publicacion> getPublicacionMasVisitada() {
        return publicacionMasVisitada;
    }	
	
	public List<Publicacion> getPublicacionUltimas() {
        return publicacionUltimas;
    }		

	public boolean isDataVisible() {
        return dataVisible;
    }

	public void setDataVisible(boolean dataVisible) {
        this.dataVisible = dataVisible;
    }
	
	public boolean isMasVendidaDataVisible() {
        return masVendidadataVisible;
    }

	public void setMasVendidaDataVisible(boolean dataVisible) {
        this.masVendidadataVisible = dataVisible;
    }

	public HtmlPanelGrid getViewPanelGrid() {
        if (viewPanelGrid == null) {
            viewPanelGrid = populateViewPanel();
        }
        return viewPanelGrid;
    }

	public void setViewPanelGrid(HtmlPanelGrid viewPanelGrid) {
        this.viewPanelGrid = viewPanelGrid;
    }

	public HtmlPanelGrid populateViewPanel() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Application application = facesContext.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        ELContext elContext = facesContext.getELContext();
        
        HtmlPanelGrid htmlPanelGrid = (HtmlPanelGrid) application.createComponent(HtmlPanelGrid.COMPONENT_TYPE);       
        
        HtmlOutputText categoriaLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        categoriaLabel.setId("categoriaLabel");
        categoriaLabel.setValue("Categoria:   ");
        htmlPanelGrid.getChildren().add(categoriaLabel);
        
        HtmlOutputText categoriaValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        categoriaValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.categoria}", Categoria.class));
        categoriaValue.setConverter(new CategoriaConverter());
        htmlPanelGrid.getChildren().add(categoriaValue);
        
        HtmlOutputText usuarioLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        usuarioLabel.setId("usuarioLabel");
        usuarioLabel.setValue("Usuario:   ");
        htmlPanelGrid.getChildren().add(usuarioLabel);
        
        HtmlOutputText usuarioValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        usuarioValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.usuario}", Usuario.class));
        usuarioValue.setConverter(new UsuarioConverter());
        htmlPanelGrid.getChildren().add(usuarioValue);
        
        HtmlOutputText tituloLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        tituloLabel.setId("tituloLabel");
        tituloLabel.setValue("Titulo:   ");
        htmlPanelGrid.getChildren().add(tituloLabel);
        
        InputTextarea tituloValue = (InputTextarea) application.createComponent(InputTextarea.COMPONENT_TYPE);
        tituloValue.setId("tituloValue");
        tituloValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.titulo}", String.class));
        tituloValue.setReadonly(true);
        tituloValue.setDisabled(true);
        htmlPanelGrid.getChildren().add(tituloValue);
        
        HtmlOutputText descripcionLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        descripcionLabel.setId("descripcionLabel");
        descripcionLabel.setValue("Descripcion:   ");
        htmlPanelGrid.getChildren().add(descripcionLabel);
        
        HtmlOutputText descripcionValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        descripcionValue.setId("descripcionValue");
        descripcionValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.descripcion}", String.class));
        htmlPanelGrid.getChildren().add(descripcionValue);
        
        HtmlOutputText tipoLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        tipoLabel.setId("tipoLabel");
        tipoLabel.setValue("Tipo:   ");
        htmlPanelGrid.getChildren().add(tipoLabel);
        
        HtmlOutputText tipoValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        tipoValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.tipo}", String.class));
        htmlPanelGrid.getChildren().add(tipoValue);
        
        HtmlOutputText cantidadLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        cantidadLabel.setId("cantidadLabel");
        cantidadLabel.setValue("Cantidad:   ");
        htmlPanelGrid.getChildren().add(cantidadLabel);
        
        HtmlOutputText cantidadValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        cantidadValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.cantidad}", String.class));
        htmlPanelGrid.getChildren().add(cantidadValue);
        
        HtmlOutputText precioLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        precioLabel.setId("precioLabel");
        precioLabel.setValue("Precio:   ");
        htmlPanelGrid.getChildren().add(precioLabel);
        
        HtmlOutputText precioValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        precioValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.precio}", String.class));
        htmlPanelGrid.getChildren().add(precioValue);
        
        HtmlOutputText fechaCreacionLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        fechaCreacionLabel.setId("fechaCreacionLabel");
        fechaCreacionLabel.setValue("Fecha Creacion:   ");
        htmlPanelGrid.getChildren().add(fechaCreacionLabel);
        
        HtmlOutputText fechaCreacionValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        fechaCreacionValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.fechaCreacion}", Date.class));
        DateTimeConverter fechaCreacionValueConverter = (DateTimeConverter) application.createConverter(DateTimeConverter.CONVERTER_ID);
        fechaCreacionValueConverter.setPattern("dd/MM/yyyy");
        fechaCreacionValue.setConverter(fechaCreacionValueConverter);
        htmlPanelGrid.getChildren().add(fechaCreacionValue);
        
        HtmlOutputText duracionLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        duracionLabel.setId("duracionLabel");
        duracionLabel.setValue("Duracion:   ");
        htmlPanelGrid.getChildren().add(duracionLabel);
        
        HtmlOutputText duracionValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        duracionValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.duracion}", String.class));
        htmlPanelGrid.getChildren().add(duracionValue);
        
        HtmlOutputText estadoLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        estadoLabel.setId("estadoLabel");
        estadoLabel.setValue("Estado:   ");
        htmlPanelGrid.getChildren().add(estadoLabel);
        
        HtmlOutputText estadoValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        estadoValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{publicacionBean.publicacion.estado}", String.class));
        htmlPanelGrid.getChildren().add(estadoValue);
        
        return htmlPanelGrid;
    }

	public Publicacion getPublicacion() {
        if (publicacion == null) {
            publicacion = new Publicacion();
        }
        return publicacion;
    }

	public void setPublicacion(Publicacion publicacion) {
        this.publicacion = publicacion;
    }

	public boolean isCreateDialogVisible() {
        return createDialogVisible;
    }

	public void setCreateDialogVisible(boolean createDialogVisible) {
        this.createDialogVisible = createDialogVisible;
    }

	public String displayList() {
        //createDialogVisible = false;
        //findAllPublicacions();
        return "publicacion";
    }

	public void reset() {
        publicacion = null;
        createDialogVisible = false;
    }

	public void handleDialogClose(CloseEvent event) {
        reset();
    }
}
